﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.IO;
using System.Timers;
using System.Threading;
using System.Net;

namespace FormAuktionsHus
{
    class ClsAuktionMonitor
    {
        public delegate void UdskrivBud(string bud);
        public event UdskrivBud UdskrivningAfBud;

        string vareNavn;
        
        bool hammerslag;
        
        long vareStartpris;
        long vareNuværendePris;

        int tæller;
        ClsOptællingsTråd optælling;
        Thread optællingstråd;
        
        List<NetworkStream> listeClients;
        IPAddress højestebudIP;

        object lås = new object();

        public ClsAuktionMonitor(string vareNavn, long vareStartpris)
        {
            this.vareNavn = vareNavn;
            hammerslag = false;
            this.vareStartpris = vareStartpris;
            vareNuværendePris = vareStartpris;
            listeClients = new List<NetworkStream>();
            UdskrivningAfBud = TomMetodeTilDeligat;
            

            optælling = new ClsOptællingsTråd(this);
            optællingstråd = new Thread(optælling.Run);
            tæller = 0;
        }

        public void TomMetodeTilDeligat(string data)
        {
            // Dumy metode til deligat
        }

        public void UdførOptælling()
        {
            lock (lås)
            {
                switch (tæller)
                {
                    case 10:
                        tæller++;
                        UdskrivningAfBud("Første");
                        SvarKlienter("Første");
                        break;
                    case 15:
                        tæller++;
                        UdskrivningAfBud("Anden");
                        SvarKlienter("Anden");
                        break;
                    case 19:
                        tæller++;
                        UdskrivningAfBud("Tredje, Solgt til IP: " + højestebudIP.ToString());
                        SvarKlienter("Tredje, Solgt til IP: " + højestebudIP.ToString());
                        hammerslag = true;
                        break;
                    default:
                        tæller++;
                        break;
                }
            }

        }


        public void TilføjKlient(NetworkStream stream)
        {
            lock (lås)
            {
                listeClients.Add(stream);
            }
        }

        public void SvarKlienter(string besked)
        {
            lock (lås)
            {
                try
                {
                    for (int i = 0; i < listeClients.Count; i++)
                    {
                        NetworkStream stream = listeClients[i];
                        StreamWriter skriver = new StreamWriter(stream);

                        skriver.WriteLine(besked);
                        skriver.Flush();
                    }
                }

                catch
                {
                    
                }
                
            }
        }

        public void ModtagBud(string bud, Socket socketData)
        {
            lock (lås)
            {
                try
                {
                    long tempPris = long.Parse(bud);
                    if (tempPris > vareNuværendePris)
                    {
                        højestebudIP = IPAddress.Parse(((IPEndPoint)socketData.RemoteEndPoint).Address.ToString());

                        vareNuværendePris = tempPris;
                        SvarKlienter("Budet ligger nu på " + vareNuværendePris);
                        UdskrivningAfBud("Budet ligger nu på " + vareNuværendePris);

                        //når første bud kommer, starter den optælling,
                        //Hvis et nyt bud kommer inden hammerslag er faldet, nulstiller den tælleren
                        //Hvis hammerslag er faldet, så får klienterne at vide, auktionen er slut. 
                        if (!optællingstråd.IsAlive && !hammerslag)
                        {

                            optællingstråd.IsBackground = true;
                            optællingstråd.Start();
                            tæller = 0;
                        }
                        else if (optællingstråd.IsAlive && !hammerslag)
                        {
                            tæller = 0;
                        }
                        else
                        {
                            UdskrivningAfBud("Auktion er slut");
                        }
                       
                    }
                }
                catch
                {

                }
            }
        }

        #region Properties
        public long GetVareNuværendePris
        {
            get { return vareNuværendePris; }
        }

        public string GetVarernavn()
        {
            return vareNavn;
        }

        public long GetVareStartpris()
        {
            return vareStartpris;
        }

        public bool GetHammerslag()
        {
            return hammerslag;
        }
        #endregion
    }
}
